Medium
Given an object or array obj
, return a compact object. A compact object is the same as the original object, except with keys containing falsy values removed. This operation applies to the object and any nested objects. Arrays are considered objects where the indices are keys. A value is considered falsy when Boolean(value)
returns false
.
You may assume the obj
is the output of JSON.parse
. In other words, it is valid JSON.
給定一個物件或陣列obj
作為參數,回傳一個緊湊物件。
緊湊物件與原始物件相同,只是刪除了包含虛假值的鍵。
此操作適用於該物件和任何嵌套物件。 陣列被視為對象,其中索引是鍵。
當Boolean(value)
傳回false
時,值被視為假值。
Example 2:
Input: obj = {"a": null, "b": [false, 1]}
Output: {"b": [1]}
Example 3:
Input: obj = [null, 0, 5, [0], [false, 16]]
Output: [5, [], [16]]
您可以假設obj
是JSON.parse
的輸出。 換句話說,它是有效的 JSON。
JSON資料格式包含Number、String、Boolean、null、Array、Object。
根據obj型別是否含嵌套結構進行處理:
如果obj不是Object或Array則直接返回自身,因為非物件和非陣列沒有鍵或索引可供刪除。
如果obj是Array,在 Array.filter(Boolean) 過濾陣列元素中的假值後,用map對每個陣列元素進行遞歸調用,返回包含遞歸結果的新陣列。
如果obj是Object,宣告物件compacted
用以保存屬性值遞歸處理後為真值的結果,用Boolean()檢驗遞歸調用屬性值後返回的結果,如果是真值則將鍵值對添加到compacted
裡。
var compactObject = function(obj) {
//處理 簡單類型
if (typeof obj !== 'object' || obj === null ) { return obj; }
//處理 包含嵌套結構的複合類型-Array
if (Array.isArray(obj)) {
return obj.filter(Boolean).map(compactObject);
}
//處理 包含嵌套結構的複合類型-Object
const compacted = {};
for (const key in obj) {
let value = compactObject(obj[key]);
if (Boolean(value)) { compacted[key] = value; }
}
return compacted;
}
let obj1 = [null, 0, false, 1];
console.log(JSON.stringify(compactObject(obj1)))
//output: [1]
let obj2 = {"a": null, "b": [false, 1]};
console.log(JSON.stringify(compactObject(obj2)))
//output: {b: [1]}
let obj3 = [null, 0, 5, [0], [false, 16]];
console.log(JSON.stringify(compactObject(obj3)))
//output: [5,[],[16]]